package com.heima.stream;
import lombok.Data;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

import java.util.concurrent.TimeUnit;

@Data
public class RedissionConfig {
    public static RedissonClient likesLock() {
        Config config = new Config();
        //指定使用单节点部署方式
        config.useSingleServer()
                .setAddress("redis://192.168.200.130:6379");
        config.useSingleServer().setConnectionPoolSize(500);//设置对于master节点的连接池中连接数最大为500
        config.useSingleServer().setIdleConnectionTimeout(10000);//如果当前连接池里的连接数量超过了最小空闲连接数，而同时有连接空闲时间超过了该数值，那么这些连接将会自动被关闭，并从连接池里去掉。时间单位是毫秒。
        config.useSingleServer().setConnectTimeout(30000);//同任何节点建立连接时的等待超时。时间单位是毫秒。
        config.useSingleServer().setTimeout(3000);//等待节点回复命令的时间。该时间从命令发送成功时开始计时。
        config.useSingleServer().setPingTimeout(30000);
        config.useSingleServer().setPassword("root");
        //获取RedissonClient对象
        RedissonClient redisson = Redisson.create(config);
        //获取锁对象
        return redisson;
    }

    public static void main(String[] args) {
        // 得到redission客户端对象
        RedissonClient redissonClient = RedissionConfig.likesLock();

        new Thread(()->{
            createLock(redissonClient,"线程1");
        }).start();
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(()->{
            RLock mylock = redissonClient.getLock("mylock");
            boolean b = mylock.tryLock();
            if (b){
                System.out.println("执行代码");
                mylock.unlock();
            }else {
                System.out.println("没得到到锁");
            }
        }).start();
    }


    public static void createLock(RedissonClient redissonClient,String name){
        // 根据客户端获取锁对象
        RLock mylock = redissonClient.getLock("mylock");// 获取非公平锁
        System.out.println(name + " 准备 加锁");
        try {
            mylock.lock();
            System.out.println(name + "加锁  成功");
            try {
                TimeUnit.SECONDS.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } finally {
            mylock.unlock();
            System.out.println(name + "解锁  成功");
        }
    }


}
